package exception.basic;
//메인 시작 ->caller 시작 -> null값이 들어와서 널포인트익셉션 발생, 널포인트 익셉션 클래스에 객체를 생성해서 위로 던진다. 그 던진걸 캐취에서 정의한 변수가 잡는다. 
public class ExceptionTest1 {
	//try-catch구문
	
	public void caller(String str){
		System.out.println("caller() start");
		try { //예외 발생 가능성이 있는 코드를 삽입, 이 try는 널포인트익셉션이라는 클래스를 던진다. 캐취가 잡지 않으면 이 에러는 JVM까지 날아간다.
		String ss = str.concat("HI");//null.concat(); 널은 뭘 호출하고 그런게 안된다. 널 포인트 익섹셥 발생, 여기서 멈추는게 아니고 호출한 곳으로 돌아간다. 이곳이 바로 에러의 발생지점 
		System.out.println("붙인 결과 : "+ss);
		} catch(NullPointerException e){ //던져진 에러 객체를 받을 변수의 타입과 변수명 지정
			//예외 처리 코드 삽입 공간, 이곳은 정해진 문법이 없다. 그냥 내가 어떻게 처리할지 메소드를 구현하면 된다.
			//예외 처리할 코드
			//프로그램은 정상흐름으로 돌아옴.
			//여기서 중요한것! System.out.println("붙인 결과 : "+ss);이게 실행되지는 않는다. 뒤로 돌아가는건 반복문 밖에 없다. 
			System.out.println("예외가 발생해서 처리했습니다.");
		}
		System.out.println("caller() exit");
	}
	
	public static void main(String[] args) {
		System.out.println("main() start");
//		String str1 = "hello"; 
		String str1 = null; //예제변경
		new ExceptionTest1().caller(str1);
		System.out.println("main() exit");
	}
}

/* 
1.번 예제 main 시작 -> caller 시작 ->붙인결과 hello hi ->caller종료->main종료

2.번 예제 main 시작 -> caller 시작,  예외 메세지
*/
